﻿package com.chinemit.cui.components.bitmap
{

	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.PixelSnapping;
	import flash.display.Sprite;
	import flash.geom.Point;
	import flash.geom.Rectangle;

	public class BitmapScale9Grid extends Sprite
	{
		private var source:Bitmap;
		private var scaleGridTop:Number;
		private var scaleGridBottom:Number;
		private var scaleGridLeft:Number;
		private var scaleGridRight:Number;

		private var leftUp:Bitmap;
		private var leftCenter:Bitmap;
		private var leftBottom:Bitmap;
		private var centerUp:Bitmap;
		private var center:Bitmap;
		private var centerBottom:Bitmap;
		private var rightUp:Bitmap;
		private var rightCenter:Bitmap;
		private var rightBottom:Bitmap;

		private var _width:Number;
		private var _height:Number;

		private var minWidth:Number;
		private var minHeight:Number;

		public function BitmapScale9Grid(source:Bitmap, scaleGridTop:Number, scaleGridBottom:Number, scaleGridLeft:Number, scaleGridRight:Number )
		{
			this.source = source;
			this.scaleGridTop = scaleGridTop;
			this.scaleGridBottom = scaleGridBottom;
			this.scaleGridLeft = scaleGridLeft;
			this.scaleGridRight = scaleGridRight;
			init(); 

		}

		/**
		 * 初始化 
		 * 
		 */		
		private function init():void
		{
			_width = source.width;
			_height = source.height;
			
			leftUp = getBitmap(0,0,scaleGridLeft,scaleGridTop);
			this.addChild(leftUp);

			leftCenter = getBitmap(0,scaleGridTop,scaleGridLeft,scaleGridBottom - scaleGridTop);
			this.addChild(leftCenter);

			leftBottom = getBitmap(0,scaleGridBottom,scaleGridLeft,source.height - scaleGridBottom);
			this.addChild(leftBottom);

			centerUp = getBitmap(scaleGridLeft,0,scaleGridRight - scaleGridLeft,scaleGridTop);
			this.addChild(centerUp);

			center = getBitmap(scaleGridLeft,scaleGridTop,scaleGridRight - scaleGridLeft,scaleGridBottom - scaleGridTop);
			this.addChild(center);

			centerBottom = getBitmap(scaleGridLeft,scaleGridBottom,scaleGridRight - scaleGridLeft,source.height - scaleGridBottom);
			this.addChild(centerBottom);

			rightUp = getBitmap(scaleGridRight,0,source.width - scaleGridRight,scaleGridTop);
			this.addChild(rightUp);

			rightCenter = getBitmap(scaleGridRight,scaleGridTop,source.width - scaleGridRight,scaleGridBottom - scaleGridTop);
			this.addChild(rightCenter);

			rightBottom = getBitmap(scaleGridRight,scaleGridBottom,source.width - scaleGridRight,source.height - scaleGridBottom);
			this.addChild(rightBottom);

			minWidth = leftUp.width + rightBottom.width;
			minHeight = leftBottom.height + rightBottom.height;
			
			
		}

		private function getBitmap(x:Number, y:Number, w:Number, h:Number):Bitmap
		{
			var bit:BitmapData = new BitmapData(w,h);
			bit.copyPixels(source.bitmapData, new Rectangle(x, y, w, h), new Point(0, 0));
			var bitMap:Bitmap = new Bitmap(bit);
			bitMap.pixelSnapping = PixelSnapping.ALWAYS;  //绝对对齐
			bitMap.x = x;
			bitMap.y = y;
			return bitMap;
		}

		override public function set width(w : Number):void
		{
			if (w < minWidth)
			{
				w = minWidth;
			}
			_width = w;
			refurbishSize();
		}

		override public function set height(h : Number):void
		{
			if (h < minHeight)
			{
				h = minHeight;
			}
			_height = h;
			refurbishSize();
		}

		private function refurbishSize():void
		{
			leftCenter.height = _height - leftUp.height - leftBottom.height;
			leftBottom.y = _height - leftBottom.height;
			centerUp.width = _width - leftUp.width - rightUp.width;
			center.width = centerUp.width;
			center.height = leftCenter.height;
			centerBottom.width = center.width;
			centerBottom.y = leftBottom.y;
			rightUp.x = _width - rightUp.width;
			rightCenter.x = rightUp.x;
			rightCenter.height = center.height;
			rightBottom.x = rightUp.x;
			rightBottom.y = leftBottom.y;
		}
		
		/**
		 * 重新设置 
		 * @param source
		 * @param scaleGridTop
		 * @param scaleGridBottom
		 * @param scaleGridLeft
		 * @param scaleGridRight
		 * 
		 */		
		public function reset(source:Bitmap, scaleGridTop:Number, scaleGridBottom:Number, scaleGridLeft:Number, scaleGridRight:Number):void{
			
			this.source = source;
			this.scaleGridTop = scaleGridTop;
			this.scaleGridBottom = scaleGridBottom;
			this.scaleGridLeft = scaleGridLeft;
			this.scaleGridRight = scaleGridRight;
			
			leftUp.bitmapData.dispose();
			leftUp = null; 
			leftCenter.bitmapData.dispose();
			leftCenter = null;
			leftBottom.bitmapData.dispose();
			leftBottom  = null;
			centerUp.bitmapData.dispose();
			centerUp = null;
			center.bitmapData.dispose();
			center = null;
			centerBottom.bitmapData.dispose();
			centerBottom = null;
			rightUp.bitmapData.dispose();
			rightUp = null;
			rightCenter.bitmapData.dispose();
			rightCenter = null;
			rightBottom.bitmapData.dispose();
			rightBottom = null;
			
			init(); 
			refurbishSize();
		}
	}

}